package com.codeing.demo.maputils;

import com.google.common.collect.*;

import java.util.Collection;
import java.util.Map;

/**
 * @author shilei
 */
public class CollectionUtilsDemo {

    public static void main(String[] args) {
        multiSet();
    }

    /**
     * 一种用来计数统计签到的Set--->Multiset
     */
    public static void multiSet(){
        Multiset<String> multiset = HashMultiset.create();
        multiset.add("one");
        multiset.add("one");
        multiset.add("one");
        multiset.add("one");
        multiset.add("one");
        multiset.add("one");
        multiset.add("two");
        multiset.add("two");
        //统计 某一个字符出现的次数 场景：某个用户在某个月内签到几次
        System.out.println(multiset.count("one"));
        System.out.println(multiset.count("two"));
    }

    /**
     * 一种有两个 key 的 HashMap--->HashBasedTable
     * 类似于 (X,Y,value) 坐标轴
     * 可以查某一个 K | Y |value 是否存在 等等
     */
    public static void hashBasedTable(){
        Table<String,String,String> hashBasedTable = HashBasedTable.create();
        hashBasedTable.put("key1","key2","value");
        System.out.println(hashBasedTable);
        System.out.println(hashBasedTable.containsColumn("key2"));
        System.out.println(hashBasedTable.containsRow("key1"));
        System.out.println(hashBasedTable.containsValue("value"));

    }

    /**
     * 一种连 value 也不能重复的 HashMap--->BiMap
     *  key 和 value 都不可以重复的场景可以使用
     */
    public static void biMap(){
        //当两个不同的key  对应的 value 重复时 直接报错 | 覆盖前一个
        BiMap<String,String> biMap = HashBiMap.create();
        biMap.put("key","value");
        //Exception in thread "main" java.lang.IllegalArgumentException: value already present: value
//        biMap.put("key1","value");
        System.out.println(biMap);
        //map 对应的 key和value 翻转
        BiMap<String, String> inverse = biMap.inverse();
        System.out.println(inverse);
        //key 相等时 覆盖前一个 value
        biMap.forcePut("key1","value");
        System.out.println(biMap);
    }

    /**
     * 一个 key 映射多个 value 的hashMap--->Multimap
     */
    public static void multimap(){
        //创建一个 key  对应多个 value 的对象 Multimap
        Multimap<String,String> multimap = HashMultimap.create();
        //添加同一个 key  对应的多个 value
        multimap.put("key","value1");
        multimap.put("key","value2");
        System.out.println(multimap);
        System.out.println(multimap.containsValue("value1"));
        System.out.println(multimap.containsKey("key"));
        System.out.println(multimap.containsEntry("key","value1"));
        //转换对应的数据集合 Map<String,<List<String>>>
        Map<String, Collection<String>> stringCollectionMap = multimap.asMap();
        System.out.println(stringCollectionMap);
    }
}
